package com.hqd.ch03.v51.boot.context.config;

import com.hqd.ch03.v51.boot.origin.Origin;

public class ConfigDataLocationNotFoundException extends ConfigDataNotFoundException {

    private final ConfigDataLocation location;

    /**
     * Create a new {@link ConfigDataLocationNotFoundException} instance.
     *
     * @param location the location that could not be found
     */
    public ConfigDataLocationNotFoundException(ConfigDataLocation location) {
        this(location, null);
    }

    /**
     * Create a new {@link ConfigDataLocationNotFoundException} instance.
     *
     * @param location the location that could not be found
     * @param cause    the exception cause
     */
    public ConfigDataLocationNotFoundException(ConfigDataLocation location, Throwable cause) {
        this(location, getMessage(location), cause);
    }

    /**
     * Create a new {@link ConfigDataLocationNotFoundException} instance.
     *
     * @param location the location that could not be found
     * @param message  the exception message
     * @param cause    the exception cause
     * @since 2.4.7
     */
    public ConfigDataLocationNotFoundException(ConfigDataLocation location, String message, Throwable cause) {
        super(message, cause);
        this.location = location;
    }

    private static String getMessage(ConfigDataLocation location) {
        return String.format("Config data %s cannot be found", getReferenceDescription(location));
    }

    private static String getReferenceDescription(ConfigDataLocation location) {
        return String.format("location '%s'", location);
    }

    /**
     * Return the location that could not be found.
     *
     * @return the location
     */
    public ConfigDataLocation getLocation() {
        return this.location;
    }

    @Override
    public Origin getOrigin() {
        return Origin.from(this.location);
    }

    @Override
    public String getReferenceDescription() {
        return getReferenceDescription(this.location);
    }

}

